package sistemaAcademico.disciplinaDAO;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

public class DisciplinaDAOArquivo implements DisciplinaDAO {

	private static final String nomeArquivo = "Disciplinas.ser";

	@SuppressWarnings("unchecked")
	public DisciplinaDTO encontrarDisciplina(String codigo) {
		ArrayList<DisciplinaDTO> disciplinas;

		// Determinando se o arquivo de dados existe
		boolean arquivoExiste = (new File(nomeArquivo)).exists();
		if (arquivoExiste) {
			// Tentativa de ler o arquivo de dados
			try {
				FileInputStream fi = new FileInputStream(nomeArquivo);
				ObjectInputStream oi = new ObjectInputStream(fi);

				disciplinas = (ArrayList<DisciplinaDTO>) oi.readObject();

				oi.close();
				fi.close();

				for (DisciplinaDTO d : disciplinas) {
					if (d.getCodigo() == codigo)
						return d;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return null;
	}

	@SuppressWarnings("unchecked")
	public void salvarDisciplina(DisciplinaDTO disciplina) {
		ArrayList<DisciplinaDTO> disciplinas = new ArrayList<DisciplinaDTO>();

		// Determinando se o arquivo de dados existe
		boolean arquivoExiste = (new File(nomeArquivo)).exists();
		if (arquivoExiste) {
			// Tentativa de ler o arquivo de dados
			try {
				FileInputStream fi = new FileInputStream(nomeArquivo);
				ObjectInputStream oi = new ObjectInputStream(fi);

				disciplinas = (ArrayList<DisciplinaDTO>) oi.readObject();

				oi.close();
				fi.close();

				for (DisciplinaDTO d : disciplinas)
					if (d.getCodigo() == disciplina.getCodigo()) {
						disciplinas.remove(d);
						break;
					}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		disciplinas.add(disciplina);

		// Gravamos a lista em arquivo!
		try {
			FileOutputStream fo = new FileOutputStream(nomeArquivo);
			ObjectOutputStream oo = new ObjectOutputStream(fo);

			oo.writeObject(disciplinas);

			oo.close();
			fo.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@SuppressWarnings("unchecked")
	public void removerDisciplina(DisciplinaDTO disciplina) {
		ArrayList<DisciplinaDTO> disciplinas = new ArrayList<DisciplinaDTO>();

		// Determinando se o arquivo de dados existe
		boolean arquivoExiste = (new File(nomeArquivo)).exists();
		if (arquivoExiste) {
			// Tentativa de ler o arquivo de dados
			try {
				FileInputStream fi = new FileInputStream(nomeArquivo);
				ObjectInputStream oi = new ObjectInputStream(fi);

				disciplinas = (ArrayList<DisciplinaDTO>) oi.readObject();

				oi.close();
				fi.close();

				// Removemos a disciplina, caso ela exista no arquivo
				for (DisciplinaDTO d : disciplinas)
					if (d.getCodigo() == disciplina.getCodigo()) {
						disciplinas.remove(d);
						break;
					}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		// Gravamos a lista em arquivo!
		try {
			FileOutputStream fo = new FileOutputStream(nomeArquivo);
			ObjectOutputStream oo = new ObjectOutputStream(fo);

			oo.writeObject(disciplinas);

			oo.close();
			fo.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	@SuppressWarnings("unchecked")
	public ArrayList<DisciplinaDTO> getLista() {
		ArrayList<DisciplinaDTO> disciplinas = new ArrayList<DisciplinaDTO>();

		// Determinando se o arquivo de dados existe
		boolean arquivoExiste = (new File(nomeArquivo)).exists();
		if (arquivoExiste) {
			// Tentativa de ler o arquivo de dados
			try {
				FileInputStream fi = new FileInputStream(nomeArquivo);
				ObjectInputStream oi = new ObjectInputStream(fi);

				disciplinas = (ArrayList<DisciplinaDTO>) oi.readObject();

				oi.close();
				fi.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		return disciplinas;
	}

	@SuppressWarnings("unchecked")
	public void imprimirDisciplinas() {
		ArrayList<DisciplinaDTO> disciplinas;

		// Determinando se o arquivo de dados existe
		boolean arquivoExiste = (new File(nomeArquivo)).exists();
		if (arquivoExiste) {
			// Tentativa de ler o arquivo de dados
			try {
				FileInputStream fi = new FileInputStream(nomeArquivo);
				ObjectInputStream oi = new ObjectInputStream(fi);

				disciplinas = (ArrayList<DisciplinaDTO>) oi.readObject();

				oi.close();
				fi.close();

				for (DisciplinaDTO c : disciplinas) {
					System.out.println("Codigo: " + c.getCodigo());
					System.out.println("Nome: " + c.getNome());
					System.out.println("Carga horaria: " + c.getCargaHoraria());
					System.out.println("Resumo: " + c.getResumo());
					System.out.println("Creditos teoricos: "
							+ c.getCreditosTeoricos());
					System.out.println("Creditos prsticos: "
							+ c.getCreditosPraticos());
					//System.out.println("Curso: " + c.getCodigoCurso());
					System.out.println();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

	@Override
	public void updateDados(DisciplinaDTO disciplina) {
		// TODO Auto-generated method stub
		
	}

	
}
